Android14 AMS 剖析—— Activity 启动分析之整体流程

8/30/2024

本文基于 android-14.0.0_r15 版本讲解

英文缩写说明:

  • AMS:ActivityManagerService
  • ATMS:ActivityTaskManagerService

Android 在 Java 层弱化了进程的概念,建立了四大组件框架。这套框架中最核心的组件就是 AMS,在 Android10 及以后,AMS 的部分功能迁移到了 ATMS。接下来我们通过分析四大组件的启动过程来了解 AMS/ATMS 的内部实现。我们首先分析 Activity 的启动过程。

# 1. 整体流程

Activity 启动过程非常复杂,涉及多种情况的处理,有各种各样的分支,全盘分析很容易迷失在源码中,我们针对具体的 App 冷启动场景进行分析,梳理出主干流程:

  • 使用 Android Studio 新建一个空项目,将其安装到模拟器中
  • 点击 Launcher 中的图标,启动这个 App

Activity 的冷启动过程涉及到多个进程:

  • 源 App 进程,一般是 Launcher
  • SystemServer 进程
  • Zygote 进程
  • 目标 App 进程

启动的整体流程如下:

20240830182218

  1. 用户点击 App 图标,Launcher 进程启动目标 Activity
  2. SystemServer 中的 AMS/ATMS 收到请求,创建对应的 ActivityRecord 和 Task,并挂载到窗口层级树中
  3. AMS/ATMS pause 源 Activity
  4. 源 Activity pause 完成后,告知 AMS/ATMS pause 过程完成,AMS/ATMS 通知到 Zygote 创建新进程
  5. 目标 App 进程启动后,向 AMS/ATMS attach 当前进程信息
  6. AMS/ATMS 远程调用到 app ,app 初始化 Application,执行 onCreate 生命周期方法,初始化 Activity,执行 onCreate OnResume 等生命周期方法

# 2.Binder 通信通道

在分析代码之前我们需要了解 App(包括了源 App 与目标 App) 与 SystemServer 之间的 Binder 通信通道。

# 2.1 App 访问 ATMS

SystemServer 在启动时会注册一个 Java Binder 服务 ATMS:

// /frameworks/base/services/java/com/android/server/SystemServer.java
// # SystemServer
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
    //......
    ActivityTaskManagerService atm = mSystemServiceManager.startService(
                ActivityTaskManagerService.Lifecycle.class).getService();
    //......
}
1
2
3
4
5
6
7
8

ATMS 的主要作用是作为服务端向客户端 App 提供管理 Activity 的接口:

startActivity
finishActivity
activityResumed
activityPaused
activityStopped
activityDestroyed
// ......
1
2
3
4
5
6
7

App 进程作为客户端通过 Binder RPC 调用到这些方法,实现 Activity 的管理:

20240112180519

ATMS 通过 AIDL 实现,相关类的类图如下:

20240103154533

# 2.2 ATMS 访问 App

在 App 进程启动的过程中,会初始化一个匿名 Java Binder 服务 ApplicationThread,ATMS 可以通过调用 ApplicationThread 的 Binder 客户端对象提供的接口,远程调用到 App 端,更新 Activity 的状态:

bindApplication
scheduleTransaction
scheduleLowMemory
scheduleSleeping
//......
1
2
3
4
5

20240112180736

此时,App 进程是服务端,SystemServer 是客户端。也就是说 App 和 SystemServer 互为客户端服务端。

ApplicationThread 同样基于 AIDL 实现,相关类的类图如下:

20240103154559

# 参考资料